package ScalaStudy.chapter05

object Test12_MyWhile {
  def main(args: Array[String]): Unit = {


    /////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////   自定义While循环  /////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////


    //1. 常规的while循环
println("(1)")

    var n = 3
    while (n >= 1){
      println(n)
      n -= 1
    }

    //2. 用闭包实现一个While函数，将代码块作为参数传入，递归调用***********看不懂
println("(2)")

    def myWhile(cond: => Boolean):(=>Unit) => Unit ={    //myWhile传递的参数是一个代码块，返回的是一个函数，函数中的参数又是一个代码块
      //内层函数需要递归调用，参数就是循环体
      def doLoop(op: =>Unit) : Unit = {
        if(cond) {
          op
          myWhile(cond)(op)
        }
      }
      doLoop _
    }

    n = 3
    myWhile(n >= 1)({
      println(n)
      n -= 1
    })

    //3. 用匿名函数实现
println("(3)")

    def myWhile2(cond: => Boolean):(=>Unit) => Unit ={    //myWhile传递的参数是一个代码块，返回的是一个函数，函数中的参数又是一个代码块
      //内层函数需要递归调用，参数就是循环体
      op => {
        if(cond) {
          op
          myWhile2(cond)(op)
        }
      }
    }

    //4. 用柯里化实现
println("(4)")

    def myWhile3(cond: => Boolean)(op: =>Unit):  Unit ={    //myWhile传递的参数是一个代码块，返回的是一个函数，函数中的参数又是一个代码块
        if(cond) {
          op
          myWhile3(cond)(op)
        }
      }

    n = 3
    myWhile(n >= 1){
      println(n)
      n -= 1
    }







  }
}
